/**
 * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */
package com.ledi.guns.core.shiro.check;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.ledi.guns.common.exception.RestSessionException;
import com.ledi.guns.core.listener.ConfigListener;
import com.ledi.guns.core.shiro.ShiroKit;
import com.ledi.guns.core.shiro.ShiroUser;
import com.ledi.guns.core.support.CollectionKit;
import com.ledi.guns.core.support.HttpKit;
import com.ledi.guns.core.util.SpringContextHolder;

/**
 * 权限自定义检查
 */
@Service
@DependsOn("springContextHolder")
@Transactional(readOnly = true)
public class PermissionCheckFactory implements ICheck {

	private final static Logger logger = LoggerFactory.getLogger(PermissionCheckFactory.class);

	public static ICheck me() {

		return SpringContextHolder.getBean(ICheck.class);
	}

	@Override
	public boolean check(Object[] permissions) {

		ShiroUser user = ShiroKit.getUser();
		if (null == user) {
			return false;
		}
		String join = CollectionKit.join(permissions, ",");
		if (ShiroKit.hasAnyRoles(join)) {
			return true;
		}
		return false;
	}

	@Override
	public boolean checkAll() {

		HttpServletRequest request = HttpKit.getRequest();

		if (null == request.getSession(false)) {
			if (true == request.getSession(true).isNew()) {
			}
			else {
				logger.info("session已经过期");
				throw new RestSessionException();
			}
		}
		ShiroUser user = ShiroKit.getUser();
		if (null == user) {
			return false;
		}
		logger.info(user.getRoleList().toString() + "角色列表");
		String requestURI = request.getRequestURI().replaceFirst(ConfigListener.getConf().get("contextPath"), "");
		logger.info(requestURI + "url地址");
		String[] str = requestURI.split("/");
		if (str.length > 3) {
			requestURI = "/" + str[1] + "/" + str[2];
		}
		if (ShiroKit.hasPermission(requestURI)) {
			return true;
		}
		return false;
	}

}
